<?php
/**
 * 业务相关助手函数
 * Created by Vscode
 * User: ChenP
 * Date: 2021-12-03 17:00
 */
declare(strict_types=1);

if (! function_exists('auth_user')) {
    /**
     * 获取用户信息
     *
     * @return array|null
     */
    function auth_user()
    {
        return request()->getAttribute('user_info');
    }
}

if (! function_exists('base64_urlsafe_encode')) {
    /**
     * 对提供的数据进行urlsafe的base64编码。
     *
     * @param string $data 待编码的数据，一般为字符串
     *
     * @return string 编码后的字符串
     * @link http://developer.qiniu.com/docs/v6/api/overview/appendix.html#urlsafe-base64
     */
    function base64_urlsafe_encode($data)
    {
        $find = array('+', '/');
        $replace = array('-', '_');
        return str_replace($find, $replace, base64_encode($data));
    }
}

if (! function_exists('base64_urlsafe_decode')) {
    /**
     * 对提供的urlsafe的base64编码的数据进行解码
     *
     * @param string $str 待解码的数据，一般为字符串
     *
     * @return string 解码后的字符串
     */
    function base64_urlsafe_decode($str)
    {
        $find = array('-', '_');
        $replace = array('+', '/');
        return base64_decode(str_replace($find, $replace, $str));
    }
}

if (! function_exists('aes_encrypt')) {
    function aes_encrypt($data){
        if (is_array($data)) {
            $str = json_encode($data, 256);
        } elseif (is_object($data)) {
            $str = json_encode($data, JSON_FORCE_OBJECT);
        } else {
            $str = $data;
        }
        return base64_encode(openssl_encrypt($str, env('AES_METHOD'),env('AES_KEY'), OPENSSL_RAW_DATA, env('AES_IV')));
    }
}

if (! function_exists('aes_decrypt')) {
    function aes_decrypt($str){
        $data = openssl_decrypt(base64_decode(trim($str)), env('AES_METHOD'), env('AES_KEY'), OPENSSL_RAW_DATA, env('AES_IV'));
        $decodeData = [];
        if($data && is_string($data))
        {
            $decodeData = json_decode($data, true);
        }

        return $decodeData;
    }
}

if (! function_exists('fetch_request_data_by_env')) {
    /**
     * 通过环境变量决定如何获取请求数据 （此时的数据为解密的数据）
     *
     * @return array|false|mixed|string
     */
    function fetch_request_data_by_env()
    {
        $enableEncryptSchema = config('app.enable_encrypt_schema');  // 是否开启了加密参数模式
        $requestIns = request();
        $input = [];
        if (! $enableEncryptSchema) {
            // $input = $requestIns->all();
            $input = array_merge_recursive($requestIns->all(), $requestIns->getUploadedFiles());
        } elseif ($requestIns->has('data')) {  // 此时，前端传过来的值是经过加密的
            $encryptStrData = $requestIns->input('data');  // 加密后的数据
            $input = aes_decrypt($encryptStrData);  // 解密后的数据
        }
        $input = empty($input) ? [] : $input;
        return $input;
    }
}

if (! function_exists('fetch_response_data_by_env')) {
    /**
     * 通过环境变量决定如何获取返回数据 （除了本地开发模式且开启了 debug 模式以外，都会返回经过加密的字符串）
     *
     * @param $data
     * @return array|false|mixed|string
     */
    function fetch_response_data_by_env($data)
    {
        $result = [];
        $enableEncryptSchema = config('app.enable_encrypt_schema');  // 是否开启了加密参数模式
        if (! $enableEncryptSchema) {
            $result = $data;
        } else {  // 此时，需要把返回结果通过加密后返回给前端
            $result = aes_encrypt($data);  // 这里返回的是经过加密后的一个字符串
        }
        return $result;
    }
}

if (! function_exists('get_rand_str')) {
    /**
     * 获取随机字符串
     *
     * @param $length  字符串长度
     * @return string  随机字符串
     */
    function get_rand_str($length=20) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        
        if ($length > $charactersLength) {
            return false; // 请求的长度大于字符集的长度，无法生成不重复的字符串
        }
        
        $randomString = '';
        $usedCharacters = [];
    
        for ($i = 0; $i < $length; $i++) {
            do {
                $randomCharacter = $characters[rand(0, $charactersLength - 1)];
            } while (in_array($randomCharacter, $usedCharacters));
    
            $usedCharacters[] = $randomCharacter;
            $randomString .= $randomCharacter;
        }
    
        return $randomString;
    }
}

/**
 * 获取订单随机号
 * @param int $length  需要多长的订单号，传一个长度
 */
if (! function_exists('get_order_no')) {
    function get_order_no($length = 20)
    {
        // 1. 年月日
        $date = date('Ymd');

        // 2. 生成随机串
        $random_string = bin2hex(random_bytes(($length - strlen($date)) / 2));

        // 3. 随机4位数字
        $random_number = mt_rand(1000, 9999);

        // 4. 生成订单号
        $order = $date . $random_string . $random_number;

        return $order;
    }
}

if (! function_exists('validate_amount')) {
    function validate_amount($amount) {
        // 使用正则表达式验证金额的格式
        if (preg_match('/^\d{1,8}(\.\d{1,2})?$/', $amount)) {
            // 使用 is_numeric() 函数来验证金额是否是数字
            if (is_numeric($amount)) {
                // 验证金额是否大于零
                $parsedAmount = floatval($amount);
                if ($parsedAmount > 0) {
                    return true; // 金额合规
                }
            }
        }
        return false; // 金额不合规
    }
}

if (! function_exists('get_last_month_year')) {
    function get_last_month_year()
    {
        $current_time = time();
        $year = date("Y", $current_time);
        $month = date("m", $current_time);
        if ($month == 1) {
            $last_year = $year - 1;
            $last_month = 12;
        } else {
            $last_year = $year;
            $last_month = $month - 1;
        }

        return ['year'=>$last_year, 'month'=>$last_month];
    }
}

if (! function_exists('time_ago')) {
    function time_ago($time) {
        $currentTime = time();
        $timeDifference = $currentTime - $time;

        if ($timeDifference < 60) {
            return $timeDifference . "秒前";
        } else if ($timeDifference < 3600) {
            return floor($timeDifference / 60) . "分钟前";
        } else if ($timeDifference < 86400) {
            return floor($timeDifference / 3600) . "小时前";
        } else {
            return floor($timeDifference / 86400) . "天前";
        }
    }
}

if(!function_exists('export_to_csv')) {
    function export_to_csv($filename, $titleArr, $data){
        $fp = fopen($filename,'w');
        fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF)); // 添加 BOM
        fputcsv($fp, $titleArr);
        foreach ($data as $item) {
            fputcsv($fp, $item);
        }
        fclose($fp);
    }
}